package leetcode.editor.cn;

//给你一个 32 位的有符号整数 x ，返回将 x 中的数字部分反转后的结果。 
//
// 如果反转后整数超过 32 位的有符号整数的范围 [−2³¹, 231 − 1] ，就返回 0。 
//假设环境不允许存储 64 位整数（有符号或无符号）。
//
// 
//
// 示例 1： 
//
// 
//输入：x = 123
//输出：321
// 
//
// 示例 2： 
//
// 
//输入：x = -123
//输出：-321
// 
//
// 示例 3： 
//
// 
//输入：x = 120
//输出：21
// 
//
// 示例 4： 
//
// 
//输入：x = 0
//输出：0
// 
//
// 
//
// 提示： 
//
// 
// -2³¹ <= x <= 2³¹ - 1 
// 
// Related Topics 数学 👍 3274 👎 0


import java.util.ArrayList;
import java.util.List;

public class P7ReverseInteger{
	public static void main(String[] args) {
		Solution solution = new P7ReverseInteger().new Solution();
		System.out.println(solution.reverse(-1230));
		System.out.println(solution.reverse(1534236469));
		System.out.println(solution.reverse(901000));
		System.out.println(solution.reverse(-2147483648));
//		System.out.println(Math.pow(10,3));
	}
	
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int reverse(int x) {
    	if (x == 0 || x == Integer.MAX_VALUE || x == Integer.MIN_VALUE) {
    		return 0;
		}
    	int sign = x > 0 ? 1 : -1;
    	x = Math.abs(x);
		List<Integer> res = new ArrayList<>();
		int curr = 0;
    	while (x > 0) {
    		curr = x % 10;
    		x = x / 10;
    		res.add(curr);
		}
    	int len = res.size() - 1;
    	int i = 0;
    	long result = 0;
    	while(len >= 0) {
    		if (res.get(i) == 0) {
				len--;
				i++;
    			continue;
			}
    		result += res.get(i) * Math.pow(10,len);
    		len--;
    		i++;
		}
    	if (result >= Integer.MAX_VALUE || result <= Integer.MIN_VALUE) {
    		return 0;
		}
		return (int) (sign * result);
    }

	public int reverse1(int x) {
		if (x == 0 || x == Integer.MAX_VALUE || x == Integer.MIN_VALUE) {
			return 0;
		}
		int sign = x > 0 ? 1 : -1;
		x = Math.abs(x);
		List<Integer> res = new ArrayList<>();
		int curr = 0;
		while (x > 0) {
			curr = x % 10;
			x = x / 10;
			res.add(curr);
		}
		int len = res.size() - 1;
		int i = 0;
		long result = 0;
		while(len >= 0) {
			if (res.get(i) == 0) {
				len--;
				i++;
				continue;
			}
			result += res.get(i) * Math.pow(10,len);
			len--;
			i++;
		}
		if (result >= Integer.MAX_VALUE || result <= Integer.MIN_VALUE) {
			return 0;
		}
		return (int) (sign * result);
	}
}
//leetcode submit region end(Prohibit modification and deletion)

}